﻿using System;
using System.Collections.Generic;
using System.Text;

namespace HITs
{
    class Indicators
    {
        /// <summary>
        /// Tính Moving Average (MA) theo dạng simple
        /// </summary>
        /// <param name="listValues">ngày hiện tại tính từ vị trí 0</param>
        /// <param name="chuKy"></param>
        /// <returns></returns>
        public static List<float> SMA(List<float> listValues, int chuKy)
        {
            List<float> result = new List<float>();
            List<float> listTemp;
            for (int i = 0; i < listValues.Count - chuKy; i++)
            {
                listTemp = new List<float>();
                for (int j = 0; j < chuKy; j++)
                    listTemp.Add(listValues[i + j]);
                result.Add(CoreFunctions.Tk_GetAverage(listTemp));
            }
            return result;
        }

        /// <summary>
        /// Tính Exponential Moving Average (EMA) theo dạng simple 
        /// EMA = Price(t) * k + EMA(y) * (1 – k)
        /// EMA(0) = average(...)
        /// </summary>
        /// <param name="listValues">ngày hiện tại tính từ vị trí 0</param>
        /// <param name="chuKy"></param>
        /// <returns></returns>
        public static List<float> EMA(List<float> listValues, int chuKy)
        {
            List<float> result = new List<float>();

            if (listValues.Count < chuKy)
                return result;

            float f = 2f / (chuKy + 1);
            int temp = listValues.Count;

            List<float> listTemp = new List<float>();

            for (int i = 0; i < chuKy; i++)
            {
                temp--;
                listTemp.Add(listValues[temp]);
            }

            result.Add(CoreFunctions.Tk_GetAverage(listTemp));

            for (int i = temp - 1; i >= 0; i--)
                result.Insert(0, (float)Math.Round(result[0] * (1 - f) + listValues[i] * f, 3));
            return result;
        }

        /// <summary>
        /// Tính Double Exponential Moving Average (DEMA)
        /// DEMA(t) = 2.EMA(t) - EMA(EMA(t))
        /// </summary>
        /// <param name="listValues"></param>
        /// <param name="chuKy"></param>
        /// <returns></returns>
        public static List<float> DEMA(List<float> listValues, int chuKy)
        {
            List<float> listEMA = EMA(listValues, chuKy);
            List<float> listEMAlv2 = EMA(listEMA, 1);
            List<float> listDEMA = new List<float>();

            for (int i = 0; i < listEMAlv2.Count; i++)
                listDEMA.Add(2 * listEMA[i] - listEMAlv2[i]);
            return listDEMA;
        }

        /// <summary>
        /// Tính Triple Exponential Moving Average (TEMA)
        /// TEMA(t) = 3.EMA(t) - 3.EMA(EMA(t)) + 3.EMA(EMA(EMA(t));
        /// </summary>
        /// <param name="listValues"></param>
        /// <param name="chuKy"></param>
        /// <returns></returns>
        public static List<float> TEMA(List<float> listValues, int chuKy)
        {
            List<float> listEMA = EMA(listValues, chuKy);
            List<float> listEMAlv2 = EMA(listEMA, 1);
            List<float> listEMAlv3 = EMA(listEMAlv2, 1);
            List<float> listTEMA = new List<float>();

            for (int i = 0; i < listEMAlv3.Count; i++)
                listTEMA.Add(3 * listEMA[i] - 3 * listEMAlv2[i] + 3 * listEMAlv3[i]);
            return listTEMA;
        }

        /// <summary>
        ///  Tính Moving Average Convergence-Divergence
        ///  chuky1 phải nhỏ hơn chuky2. MACD chuyển động nhanh hơn signalLine
        /// </summary>
        /// <param name="listValues">ngày hiện tại tính từ vị trí 0</param>
        /// <param name="chuky1"></param>
        /// <param name="chuky2"></param>
        /// <param name="periodMACD"></param>
        /// <returns>histogram</returns>
        public static void MACD(List<float> listValues, int chuky1, int chuky2, int periodMACD, ref List<float> MACD, ref List<float> signalLine)
        {
            int temp;
            if (chuky1 > chuky2)  /// đảm bảo chuky1 luôn nhỏ hơn chuky2
            {
                temp = chuky1;
                chuky1 = chuky2;
                chuky2 = temp;
            }

            MACD = new List<float>();
            signalLine = new List<float>();

            if (listValues.Count < chuky2)
                return;

            List<float> EMA1 = EMA(listValues, chuky1);
            List<float> EMA2 = EMA(listValues, chuky2);

            for (int i = 0; i < EMA2.Count; i++)
                MACD.Add(EMA1[i] - EMA2[i]);
            signalLine = EMA(MACD, periodMACD);


        }

        public static void MACD_smoothDEMA(List<float> listValues, int chuky1, int chuky2, int periodMACD, ref List<float> MACD, ref List<float> signalLine)
        {
            int temp;
            if (chuky1 > chuky2)  /// đảm bảo chuky1 luôn nhỏ hơn chuky2
            {
                temp = chuky1;
                chuky1 = chuky2;
                chuky2 = temp;
            }

            MACD = new List<float>();
            signalLine = new List<float>();

            if (listValues.Count < chuky2)
                return;

            List<float> DEMA1 = DEMA(listValues, chuky1);
            List<float> DEMA2 = DEMA(listValues, chuky2);

            for (int i = 0; i < DEMA2.Count; i++)
                MACD.Add(DEMA1[i] - DEMA2[i]);
            signalLine = EMA(MACD, periodMACD);
        }

        public static void MACD_smoothTEMA(List<float> listValues, int chuky1, int chuky2, int periodMACD, ref List<float> MACD, ref List<float> signalLine)
        {
            int temp;
            if (chuky1 > chuky2)  /// đảm bảo chuky1 luôn nhỏ hơn chuky2
            {
                temp = chuky1;
                chuky1 = chuky2;
                chuky2 = temp;
            }

            MACD = new List<float>();
            signalLine = new List<float>();

            if (listValues.Count < chuky2)
                return;

            List<float> TEMA1 = TEMA(listValues, chuky1);
            List<float> TEMA2 = TEMA(listValues, chuky2);

            for (int i = 0; i < TEMA2.Count; i++)
                MACD.Add(TEMA1[i] - TEMA2[i]);
            signalLine = EMA(MACD, periodMACD);
        }

        public static int MACD_XacDinhTinHieuMua(List<float> listNgan, List<float> listDai, int KhoangCachBreak)
        {
            if (listDai.Count > KhoangCachBreak)
            {
                List<float> listChechlech = new List<float>();
                List<float> listTemp = new List<float>();
                float avg;

                for (int i = 0; i < listDai.Count; i++)
                    if (listNgan[i] >= listDai[i] && listNgan[i] > 0f)
                        listChechlech.Add((float)Math.Round(listNgan[i] - listDai[i], 2));

                for (int i = 0; i < KhoangCachBreak; i++)
                    if (Math.Abs(listChechlech[i]) > 0.00f)
                    {
                        listTemp = new List<float>();
                        for (int j = 1; j < 7; j++)
                            if ((i + j) < listDai.Count)
                                listTemp.Add(listChechlech[i + j]);
                        avg = (float)Math.Round(CoreFunctions.Tk_GetAverage(listTemp), 2);
                        if (avg < 0 || avg == 0.00f)
                            return i;
                    }
            }
            return -1;
        }

        public static List<int> MACD_XacDinhListTinHieuMua(List<float> listNgan, List<float> listDai, int soNgayCachBreak)
        {
            List<int> listResult = new List<int>();
            bool flag;
            int count;
            List<float> listChechlech = new List<float>();
            List<float> listBreak = new List<float>();
            List<float> listTemp = new List<float>();

            for (int i = 0; i < listDai.Count; i++)
                if (listNgan[i] >= listDai[i])                  //// luôn đảm bảo < 100f là những tín hiệu mua
                    listChechlech.Add((float)Math.Round(listNgan[i] - listDai[i], 2));
                else
                    listChechlech.Add(-100f);

            for (int i = 0; i < listDai.Count; i++)
                if (i + soNgayCachBreak + 1 < listDai.Count
                    //&& Math.Abs(listChechlech[i + soNgayCachBreak + 1]) < 0.02f
                    //&& listNgan[i + soNgayCachBreak + 1] > 0.0f
                    )
                {
                    listTemp = new List<float>();
                    count = 0;
                    for (int j = 0; j < soNgayCachBreak; j++)
                        if (listChechlech[i + j] > listChechlech[i + j + 1])
                            count++;
                    //listTemp.Add(listChechlech[i + j]);

                    if (count == soNgayCachBreak)
                    {
                        flag = false;
                        //for (int k = 1; k < 3; k++)
                        //    if (i + soNgayCachBreak + 1 + k < listDai.Count
                        //        && listNgan[i + soNgayCachBreak + 1 + k] > listDai[i + soNgayCachBreak + 1 + k])
                        //    {
                        //        flag = true;
                        //        break;
                        //    }
                        if (flag == false)
                            listResult.Add(i);
                    }
                }

            return listResult;
        }

        public static void BollingerBand(List<float> listValues, int soNgay
            , ref List<float> DuongGiua, ref List<float> DuongTren, ref List<float> DuongDuoi)
        {
            DuongGiua = SMA(listValues, soNgay);
            List<float> listStd = CoreFunctions.Tk_PopularStandardDeviation(listValues, soNgay);
            DuongDuoi = new List<float>();
            DuongTren = new List<float>();

            for (int i = 0; i < listStd.Count; i++)
            {
                DuongTren.Add((float)Math.Round(DuongGiua[i] + 2 * listStd[i], 1));
                DuongDuoi.Add((float)Math.Round(DuongGiua[i] - 2 * listStd[i], 1));
                DuongGiua[i] = (float)Math.Round(DuongGiua[i], 1);
            }
        }

        public static List<float> GetSignalBuySell(List<float> histogramMACD, int khoangcach2dinhtoithieu = 5)
        {
            List<float> listResult = new List<float>();
            int count = 0;
            float max = 0;
            bool flag_bearish = false, flag_bullish = false;

            listResult.Add(0);
            for (int i = histogramMACD.Count - 2; i >= 0; i--)
            {
                #region Hiệu chỉnh
                listResult.Insert(0, 0);
                if (flag_bearish == false && histogramMACD[i + 1] >= 0 && histogramMACD[i] < 0)
                {
                    flag_bearish = true;
                    count = 0;
                    max = 0;
                }

                if (flag_bullish == false && histogramMACD[i + 1] <= 0 && histogramMACD[i] > 0)
                {
                    flag_bullish = true;
                    count = 0;
                    max = 0;
                }
                #endregion

                #region ------ Signal Buy
                if (flag_bearish == true)
                {
                    if (histogramMACD[i] <= histogramMACD[i + 1])
                    {
                        count++;
                        if (max < Math.Abs(histogramMACD[i]))
                            max = Math.Abs(histogramMACD[i]);
                    }
                    else
                    {
                        if (histogramMACD[i] >= 0)
                            flag_bearish = false;
                        else if (count >= khoangcach2dinhtoithieu 
                            && histogramMACD[i + 1] < histogramMACD[i + 2])
                        {
                            listResult[0] = max;
                            count = 0;
                        }
                    }
                }
                #endregion

                #region ------ Signal Sell
                if (flag_bullish == true)
                {
                    if (histogramMACD[i] >= histogramMACD[i + 1])
                    {
                        count++;
                        if (max < Math.Abs(histogramMACD[i]))
                            max = Math.Abs(histogramMACD[i]);
                    }
                    else
                    {
                        if (histogramMACD[i] < 0 )
                            flag_bullish = false;
                        else if (count >= khoangcach2dinhtoithieu 
                            && histogramMACD[i + 1] > histogramMACD[i + 2])
                        {
                            listResult[0] = -max;
                            count = 0;
                        }
                    }
                }
                #endregion
            }
            return listResult;
        }

        public static float TinhDongTienDuongAm(List<float> listGiaDongCua, List<float> listKhoiLuong, int soNgay, ref List<float> listGiaTri)
        {
            List<float> listValue = new List<float>();
            float sumDongTien = 0f, temp = 0f;
            listGiaTri = new List<float>();

            for (int i = 0; i < soNgay; i++)
            {
                listValue.Add(listGiaDongCua[i] * listKhoiLuong[i]);
            }

            for (int i = 0; i < soNgay - 3; i++)
            {
                temp = listValue[i] - listValue[i + 3];
                temp /= 1000;
                sumDongTien += temp;
                listGiaTri.Add(temp);
            }
            return sumDongTien;
        }
        /// <summary>
        /// Intraday Momentum Index
        /// </summary>
        /// <param name="listGiaMoCua">list giá hiện tại ở 0, quá khứ ở cuối danh sách</param>
        /// <param name="listGiaDongCua">list giá hiện tại ở 0, quá khứ ở cuối danh sách</param>
        /// <returns></returns>
        public static List<float> IMI(int soNgay, List<float> listGiaMoCua, List<float> listGiaDongCua)
        {
            List<float> listResult = new List<float>();
            if (listGiaMoCua.Count <= 10 || listGiaDongCua.Count <= 10 || listGiaDongCua.Count != listGiaMoCua.Count)
                return null;

            /// giá đóng cửa trừ giá mở cửa
            List<float> listGiaDong_Tru_GiaMo = new List<float>();
            for (int i = 0; i < listGiaMoCua.Count; i++)
            {
                if (listGiaMoCua[i] == 0 && i + 1 < listGiaMoCua.Count)
                    listGiaMoCua[i] = listGiaMoCua[i + 1];
                listGiaDong_Tru_GiaMo.Add(listGiaDongCua[i] - listGiaMoCua[i]);
            }

            /// Tính danh sách giá đóng cửa lớn hơn mở cửa và giá trị tuyệt đối đóng cửa nhỏ hơn mở cửa.            
            List<float> listDongCuaLonHonMoCua = new List<float>();
            List<float> listDongCuaNhoHonMoCua = new List<float>();

            for (int i = 0; i < listGiaDong_Tru_GiaMo.Count; i++)
                if (listGiaDong_Tru_GiaMo[i] > 0)
                {
                    listDongCuaLonHonMoCua.Add(listGiaDong_Tru_GiaMo[i]);
                    listDongCuaNhoHonMoCua.Add(0.0f);
                }
                else
                {
                    listDongCuaLonHonMoCua.Add(0.0f);
                    listDongCuaNhoHonMoCua.Add(Math.Abs(listGiaDong_Tru_GiaMo[i]));
                }

            /// Tổng 7 ngày của danh sách giá đóng cửa lớn hơn mở cửa.
            /// Tổng 7 ngày của danh sách giá đóng cửa nhỏ hơn mở cửa.
            float tong = 0f;
            int dem = 0;
            List<float> list7Ngay_dsDongCuaLon_dsMoCua = new List<float>();
            List<float> list7Ngay_dsDongCuaNho_dsMoCua = new List<float>();

            for (int i = 0; i < listDongCuaNhoHonMoCua.Count - soNgay; i++)
            {
                dem = 0;
                tong = 0;
                while (dem < soNgay)
                {
                    tong += listDongCuaLonHonMoCua[i + dem];
                    dem++;
                }
                list7Ngay_dsDongCuaLon_dsMoCua.Add(tong);

                dem = 0;
                tong = 0;
                while (dem < soNgay)
                {
                    tong += listDongCuaNhoHonMoCua[i + dem];
                    dem++;
                }
                list7Ngay_dsDongCuaNho_dsMoCua.Add(tong);
            }

            /// List tổng giữa list7Ngay_dsDongCuaNho_dsMoCua và list7Ngay_dsDongCuaLon_dsMoCua
            List<float> listTong = new List<float>();
            for (int i = 0; i < list7Ngay_dsDongCuaLon_dsMoCua.Count; i++)
                listTong.Add(list7Ngay_dsDongCuaLon_dsMoCua[i] + list7Ngay_dsDongCuaNho_dsMoCua[i]);

            /// Tính IMI
            for (int i = 0; i < list7Ngay_dsDongCuaLon_dsMoCua.Count; i++)
            {
                tong = list7Ngay_dsDongCuaLon_dsMoCua[i] / listTong[i] * 100;
                tong = (float)Math.Round(tong, 0);
                listResult.Add(tong);
            }
            return listResult;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="listGiaCaoNhat">hướng thời gian: 0 là quá khứ - cuối là hiện tại</param>
        /// <param name="listGiaThapNhat">hướng thời gian: 0 là quá khứ - cuối là hiện tại</param>
        /// <param name="listGiaDongCua">hướng thời gian: 0 là quá khứ - cuối là hiện tại</param>
        /// <param name="listKhoiLuong"></param>
        /// <returns></returns>
        public static void KlingerOscillator(List<float> listGiaCaoNhat, List<float> listGiaThapNhat, List<float> listGiaDongCua
                                           , List<int> listKhoiLuong, ref  List<float> listKlingerOscillator, ref List<float> signalLine)
        {
            /// ngày hiện tại = list.count (ngày quá khứ là 0)
            if (listGiaCaoNhat.Count < 3)
                return;

            #region Khai báo biến
            listKlingerOscillator = new List<float>();
            signalLine = new List<float>();

            List<float> listDailyMeasurement = new List<float>();
            List<float> listCM = new List<float>();
            List<float> listDonglucKhoiLuong = new List<float>();

            List<float> EMA_34 = new List<float>();
            List<float> EMA_55 = new List<float>();

            List<int> listXuHuong = new List<int>();
            int length = listGiaCaoNhat.Count;
            float bienTinhToan;
            #endregion

            #region Tính xu hướng
            for (int i = 1; i < length; i++)
                if (listGiaCaoNhat[i] + listGiaThapNhat[i] + listGiaDongCua[i]
                    > listGiaCaoNhat[i - 1] + listGiaThapNhat[i - 1] + listGiaDongCua[i - 1])
                    listXuHuong.Add(1);
                else
                    listXuHuong.Add(-1);
            #endregion

            #region Tính DailyMeasurement (DM)
            for (int i = 0; i < length; i++)
            {
                if ((listGiaCaoNhat[i] - listGiaThapNhat[i]).ToString() == "NaN")
                    Console.Write("dsd");
                listDailyMeasurement.Add(listGiaCaoNhat[i] - listGiaThapNhat[i]);
            }
            #endregion

            #region Tính CM
            float tong = listDailyMeasurement[0] + listDailyMeasurement[1];
            listCM.Add(tong);
            for (int i = 2; i < listXuHuong.Count; i++)
            {
                if (listXuHuong[i] == listXuHuong[i - 1])
                    tong += listDailyMeasurement[i];
                else
                    tong = listDailyMeasurement[i] + listDailyMeasurement[i - 1];

                listCM.Add(tong);
            }
            #endregion

            #region Tính Động lực khối lượng
            /// length của listXuHuong = length của listCM
            /// length của listXuHuong = length của listDailyMeasurement - 1
            /// length của listXuHuong = length của listKhoiLuong - 1

            for (int i = 0; i < listCM.Count; i++)
            {
                if (listCM[i] == 0f)
                    listCM[i] = 1f;
                bienTinhToan = (float)Math.Round(2 * (listDailyMeasurement[i + 1] / listCM[i]) - 1);
                bienTinhToan = bienTinhToan * listKhoiLuong[i + 1] * listXuHuong[i];
                listDonglucKhoiLuong.Add(bienTinhToan);
            }
            #endregion

            #region EMA 34 và 55 ngày
            EMA_34 = EMA(CoreFunctions.Xuly_DaoNguocList(listDonglucKhoiLuong), 34);
            EMA_55 = EMA(CoreFunctions.Xuly_DaoNguocList(listDonglucKhoiLuong), 55);
            #endregion

            #region Tính Klinger Oscillator
            if (EMA_34.Count < EMA_55.Count)
                length = EMA_34.Count;
            else
                length = EMA_55.Count;


            for (int i = 0; i < length; i++)
            {
                listKlingerOscillator.Insert(0, EMA_34[i] - EMA_55[i]);
            }

            signalLine = EMA(CoreFunctions.Xuly_DaoNguocList(listKlingerOscillator), 13);
            signalLine = CoreFunctions.Xuly_DaoNguocList(signalLine);
            #endregion
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="listGiaDongCua">ngày mới nhất ở 0</param>
        /// <returns></returns>
        public static List<float> RSI(int soNgay, List<float> listGiaDongCua)
        {
            List<float> listResult = new List<float>();

            List<float> Gain = new List<float>();
            List<float> Loss = new List<float>();

            int count = 0;
            float avgGain = 0f, avgLoss = 0f, RS, RSI = 0f, valueGain, valueLoss;

            for (int j = 0; j < listGiaDongCua.Count - 50; j++)
            {
                Gain = new List<float>();
                Loss = new List<float>();
                count = 0;
                avgGain = 0f;
                avgLoss = 0f;
                RSI = 0f;

                for (int i = soNgay + 14; i > 0; i--)
                {
                    if (count <= 14)
                    {
                        if (listGiaDongCua[i - 1 + j] > listGiaDongCua[i + j])
                            Gain.Add(listGiaDongCua[i - 1 + j] - listGiaDongCua[i + j]);
                        else
                            Loss.Add(listGiaDongCua[i + j] - listGiaDongCua[i - 1 + j]);

                        if (count == soNgay)
                        {
                            avgGain = CoreFunctions.Tk_GetSum(Gain) / soNgay;
                            avgLoss = CoreFunctions.Tk_GetSum(Loss) / soNgay;
                            RS = avgGain / avgLoss;
                            RSI = 100f - (100f / (1 + RS));
                        }
                    }
                    else
                    {
                        valueLoss = 0f;
                        valueGain = 0f;
                        if (listGiaDongCua[i - 1 + j] > listGiaDongCua[i + j])
                            valueGain = listGiaDongCua[i - 1 + j] - listGiaDongCua[i + j];
                        else
                            valueLoss = listGiaDongCua[i + j] - listGiaDongCua[i - 1 + j];
                        avgGain = (avgGain * (soNgay - 1) + valueGain) / soNgay;
                        avgLoss = (avgLoss * (soNgay - 1) + valueLoss) / soNgay;
                        RS = avgGain / avgLoss;
                        RSI = 100f - (100f / (1 + RS));
                    }
                    count++;
                }
                listResult.Add(RSI);
            }
            return listResult;
        }

        public static List<float> MFI(int soNgay, List<float> listGiaCaoNhat
            , List<float> listGiaThapNhat, List<float> listGiaDongCua, List<int> listKhoiluongGiaoDich)
        {
            List<float> listResult = new List<float>();
            List<float> listValue = new List<float>();
            List<float> listGia = new List<float>();
            float sumPos = 0f, sumNeg = 0f;
            float MR, MFI, gia;

            for (int j = 0; j < listGiaCaoNhat.Count - 50; j++)
            {
                listGia = new List<float>();
                listValue = new List<float>();
                sumPos = 0f;
                sumNeg = 0f;
                for (int i = 0; i < soNgay + 1; i++)
                {
                    gia = (listGiaCaoNhat[i + j] + listGiaThapNhat[i + j] + listGiaDongCua[i + j]) / 3;
                    listGia.Add(gia);
                    listValue.Add(gia * listKhoiluongGiaoDich[i + j]);
                }

                for (int i = 0; i < soNgay; i++)
                    if (listGia[i] >= listGia[i + 1])
                        sumPos += listValue[i];
                    else
                        sumNeg += listValue[i];
                MR = sumPos / sumNeg;
                MFI = 100f - (100f / (1 + MR));
                listResult.Add(MFI);
            }
            return listResult;
        }

        /// <summary>
        /// Chạy từ cuối chạy về 0
        /// </summary>
        /// <param name="listOpen"></param>
        /// <param name="listClose"></param>
        /// <param name="listMax"></param>
        /// <param name="listMin"></param>
        /// <param name="listVolume"></param>
        /// <returns></returns>
        public static List<float> AccumulationDistributionLine(List<float> listOpen, List<float> listClose, List<float> listMax
            , List<float> listMin, List<float> listVolume)
        {
            List<float> listResult = new List<float>();
            int len = listOpen.Count;
            if (listClose.Count == len && listMax.Count == len && listMin.Count == len && listVolume.Count == len)
            {
                List<float> listCloseMin = new List<float>();
                List<float> listMaxClose = new List<float>();
                List<float> listMaxMin = new List<float>();

                float closemin, maxclose, maxmin, temp, temp1;
                float count = 0;
                for (int i = len - 1; i >= 0; i--)
                {
                    closemin = listClose[i] - listMin[i];
                    maxclose = listMax[i] - listClose[i];
                    maxmin = listMax[i] - listMin[i];
                    temp = closemin - maxclose;
                    temp1 = temp / maxmin;
                    count += temp1 * listVolume[i];
                    listResult.Insert(0, count);
                }
            }
            return listResult;
        }

        /// <summary>
        /// lấy giá trị MAX(listClose,số ngày).
        /// Sau đó, tính chêch lệch với ngày hiện tại listClose[0]
        /// </summary>
        /// <param name="listClose"></param>
        /// <param name="soNgay"></param>
        /// <returns></returns>
        public static float Filter1(List<float> listClose, int soNgay)
        {
            float result = 0f;
            float max = listClose[1];

            for (int i = 2; i < soNgay; i++)
                if (max < listClose[i])
                    max = listClose[i];
            result = (listClose[0] - max) / max;
            result = (float)Math.Round(result, 3);
            return result;
        }

    }
}
